/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.output.p44;

import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IClientProfessionnel;
import fr.generali.accueilclient.client.om.ISphereProfessionnelle;
import fr.generali.accueilclient.client.om.impl.ClientProfessionnel;
import fr.generali.accueilclient.client.om.impl.SphereProfessionnelle;
import fr.generali.refservcommuns.rce.demat.consultpersonneenvcomplet.dossierpersonneenvcomplet.DtoDossierP44;
import fr.generali.refservcommuns.rce.demat.consultpersonneenvcomplet.dossierpersonneenvcomplet.DtoDossierSphereProfessionnelle;
import fr.generali.refservcommuns.clients.prima.DatedMonetaryQuantityRangeValue;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.detailspersonnes.DtoResultatFinancierFrance;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.detailspersonnes.DtoSuiviAnnuelEntreprise;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoPersonneMorale;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoPersonnePhysique;

/**
 * Transforme un {@link DtoDossierP44} en {@link IClientProfessionnel}
 * 
 * @author selrhazala
 */
@Component("dtoDossierP44ToClientProfessionnelConverter")
public class DtoDossierP44ToClientProfessionnelConverter implements Converter<DtoDossierP44, IClientProfessionnel> {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(DtoDossierP44ToClientProfessionnelConverter.class);

    /**
     * {@inheritDoc}
     */
    public IClientProfessionnel convert(DtoDossierP44 input) {
        LOGGER.debug("assemble");
        IClientProfessionnel client = new ClientProfessionnel();
        ISphereProfessionnelle spherePro = new SphereProfessionnelle();
        DtoPersonnePhysique personne = input.getPersonnePhysique();
        client.setSphereProfessionnelle(spherePro);

        if (personne.getDateCreation() != null) {
            client.setDateCreation(personne.getDateCreation().toGregorianCalendar().getTime());
        }
        
        List<DtoDossierSphereProfessionnelle> sphereProListe = input.getDossierSphereProfessionnelle();
        if (sphereProListe != null && !sphereProListe.isEmpty()
                        && sphereProListe.get(0) != null) {
            DtoPersonneMorale personneMorale = sphereProListe.get(0).getSphereProfessionnelle();

            spherePro.setRaisonSociale(personneMorale.getRaisonSociale());
            if (personneMorale.getEntreprise() != null) {
                spherePro.setSiren(personneMorale.getEntreprise().getCodeSIREN());
                spherePro.setCodeNic(personneMorale.getEntreprise().getCodeNIC());
                spherePro.setCaisseRetraite(personneMorale.getEntreprise().getCaisseRetraite());
            }
            spherePro.setCodeNaf(personneMorale.getCodeNAF());

            if (personneMorale.getIdentifiantPersonne() != null) {
                spherePro.setIdSpherePro(personneMorale.getIdentifiantPersonne());
            }
            
            if (personneMorale.getDateEtablissement() != null) {
                spherePro.setDateCreationEntreprise(personneMorale.getDateEtablissement().toGregorianCalendar()
                                .getTime());
            }

            if (CollectionUtils.isNotEmpty(personneMorale.getResultatFinancier())) {
                DtoResultatFinancierFrance resultatFinancier =
                                personneMorale.getResultatFinancier().get(
                                                personneMorale.getResultatFinancier().size() - 1);

                if (resultatFinancier.getChiffreAffaireBorne() != null) {
                    spherePro.setNiveauCA(resultatFinancier.getChiffreAffaireBorne().getCodeIndicateurSaisie());
                }
                if (resultatFinancier.getPeriodeConsideree() != null
                                && resultatFinancier.getPeriodeConsideree().getStartDate() != null
                                && resultatFinancier.getPeriodeConsideree().getStartDate().toString().length() > 3) {
                    spherePro.setAnneeExercice(resultatFinancier.getPeriodeConsideree().getStartDate().toString()
                                    .substring(0, 4));
                }
            }

            if (personneMorale.getResultatFinancierAExport() != null
                            && !personneMorale.getResultatFinancierAExport().isEmpty()) {
                DatedMonetaryQuantityRangeValue chiffreAffaireBorneAExport =
                                personneMorale.getResultatFinancierAExport().get(0).getChiffreAffaireAExportBorne();
                if (chiffreAffaireBorneAExport != null) {
                    spherePro.setPartCAExport(chiffreAffaireBorneAExport.getCodeIndicateurSaisie());
                }
            }

            if (CollectionUtils.isNotEmpty(personneMorale.getSuiviAnnuelEntreprise())) {
                DtoSuiviAnnuelEntreprise dtoSuiviAnnuelEntreprise =
                                personneMorale.getSuiviAnnuelEntreprise().get(
                                                personneMorale.getSuiviAnnuelEntreprise().size() - 1);

                spherePro.setNbSalaries((dtoSuiviAnnuelEntreprise.getNombreEmployesBorne() == null) ? null
                                : dtoSuiviAnnuelEntreprise.getNombreEmployesBorne().getCodeIndicateurSaisie());

                spherePro.setAnneeExercice((dtoSuiviAnnuelEntreprise.getExercice() == null) ? null
                                : dtoSuiviAnnuelEntreprise.getExercice().toString());

                spherePro.setNbCadres((dtoSuiviAnnuelEntreprise.getNombreCadresBorne() == null) ? null
                                : dtoSuiviAnnuelEntreprise.getNombreCadresBorne().getCodeIndicateurSaisie());
            }

            if (personneMorale.getMoisClotureComptable() != null) {
                if (personneMorale.getMoisClotureComptable().toString().length() == 1) {
                    spherePro.setMoisClotureComptable("0" + personneMorale.getMoisClotureComptable());
                } else {
                    spherePro.setMoisClotureComptable(personneMorale.getMoisClotureComptable().toString());
                }
            }
            
            if (StringUtils.isNotEmpty(personneMorale.getFormeJuridique())) {
                spherePro.setFormeJuridique(personneMorale.getFormeJuridique());
            }
            
        }

        if (personne.getCompteEspaceClient() != null
                        && personne.getCompteEspaceClient().length() > 0) {
            client.setCompteEspaceClient(personne.getCompteEspaceClient());
        }
        
        if (personne.getDetailSituationFamiliale() != null) {
            client.setSituationFamiliale(personne.getDetailSituationFamiliale().getEtatUnion());
            client.setRegimeMatrimonial(personne.getDetailSituationFamiliale().getStatutMatrimonial());
            if (personne.getDetailSituationFamiliale().getNombreEnfants() != null) {
                client.setNbEnfants(personne.getDetailSituationFamiliale().getNombreEnfants().toString());
            }
        }
        
        if (personne.getDetailNaissance() != null) {
            client.setLieuNaissance(StringUtils.trimToNull(personne.getDetailNaissance().getLieuNaissance()));
            client.setCpNaissance(StringUtils.trimToNull(personne.getDetailNaissance().getCodePostalNaissance()));
            client.setPaysNaissance(StringUtils.trimToNull(personne.getDetailNaissance().getPaysDeNaissance()));
        }
        
        client.setNationalite(StringUtils.trimToNull(personne.getNationalite()));
        client.setOrigineClient(StringUtils.trimToNull(personne.getRaisonConnaissanceTiers()));
        client.setTutelle(StringUtils.trimToNull(personne.getGestionTutelleCuratelle()));
        client.setRegimeObligatoire(StringUtils.trimToNull(personne.getCodeTypeAffiliation()));
//        client.setNomProtecteur(StringUtils.trimToNull(personne.getRaisonConnaissanceTiers()));
        
        if (personne.getRelationClient() != null) {
            client.setTitreCourrier(StringUtils.trimToNull(personne.getRelationClient().getTitreCourrier()));
        }

        if (personne.getDateRetraite() != null) {
            client.setFinActivite(personne.getDateRetraite().toGregorianCalendar().getTime());
        }
        
        if (personne.getSecteurActivite() != null) {
            client.setSecteurActivite(personne.getSecteurActivite().getCode());
        }
        
        if (personne.isVip() != null) {
            client.setClientVIP(personne.isVip());
        }
        
        if (personne.isIndicateurCollaborateur() != null) {
            client.setCollaborateurGenerali(personne.isIndicateurCollaborateur());
        }

        return client;
    }
}
